package label_center

import (
	"crypto/md5"
	"fmt"
	"time"

	"github.com/qida/gohp/timex"
)

// 设备标签绑定关系

// 请求 创建
type ReqCreateRecLabelDevice struct {
	DeviceId   string    `json:"DeviceId"`          // 设备编码(国标Id)
	DeviceApn  string    `json:"DeviceApn"`         // 设备接入点(国标Id)
	ChannelId  int64     `json:"ChannelId"`         // 通道Id，设备为NVR时= -1
	LabelId    int64     `json:"LabelId"`           // 标签Id
	LabelValue string    `json:"LabelValue"`        // 标签值内容
	TimeStart  time.Time `json:"TimeStart"`         // 标签关系启用时间
	TimeEnd    time.Time `json:"TimeEnd,omitempty"` // 标签关系终止时间

	// Log Log `json:"Log,omitempty"` // 追踪日志
}

// 请求 删除
type ReqDeleteRecLabelDevice struct {
	DeviceId   string    `json:"DeviceId"`          // 设备编码(国标Id)
	DeviceApn  string    `json:"DeviceApn"`         // 设备接入点(国标Id)
	ChannelId  int64     `json:"ChannelId"`         // 通道Id，设备为NVR时= -1
	LabelId    int64     `json:"LabelId"`           // 标签Id
	LabelValue string    `json:"LabelValue"`        // 标签值内容
	TimeStart  time.Time `json:"TimeStart"`         // 标签关系启用时间
	TimeEnd    time.Time `json:"TimeEnd,omitempty"` // 标签关系终止时间

	// Log Log `json:"Log,omitempty"` // 追踪日志
}

// 请求 更新
type ReqUpdateRecLabelDevice struct {
	DeviceId   string `json:"DeviceId"`   // 设备编码(国标Id)
	DeviceApn  string `json:"DeviceApn"`  // 设备接入点(国标Id)
	ChannelId  int64  `json:"ChannelId"`  // 通道Id，设备为NVR时= -1
	LabelId    int64  `json:"LabelId"`    // 标签Id
	LabelValue string `json:"LabelValue"` // 标签值内容
	// Status     int8      `json:"Status"`            //状态（1正常,-10禁用）
	TimeStart time.Time `json:"TimeStart"`         // 标签关系启用时间
	TimeEnd   time.Time `json:"TimeEnd,omitempty"` // 标签关系终止时间

	// Log Log `json:"Log,omitempty"` // 追踪日志
}

// 请求 查询
type ReqSearchRecLabelDevice struct {
	KeyWord     string    `json:"KeyWord,omitempty"`     // 全局关键词
	DeviceId    string    `json:"DeviceId"`              // 设备编码(国标Id)
	DeviceApn   string    `json:"DeviceApn"`             // 设备接入点(国标Id)
	ChannelId   int64     `json:"ChannelId"`             // 通道Id，设备为NVR时= -1
	LabelId     int64     `json:"LabelId"`               // 标签Id
	LabelValue  string    `json:"LabelValue"`            // 标签值内容
	TimeStart   time.Time `json:"TimeStart"`             // 标签标记开始时间
	TimeEnd     time.Time `json:"TimeEnd"`               // 标签标记结束时间，默认2099年1月1日
	Page        int64     `json:"Page"`                  // 必填 指定返回页码号
	Limit       int64     `json:"Limit"`                 // 必填 指定返回每页条数
	FieldOrders []string  `json:"FieldOrders,omitempty"` // 指定要排序的字段数组，默认升序，降序加前缀-，如 ["-Id", "Name"] 按Id降序Name升序排列
}

func (t *ReqSearchRecLabelDevice) MD5() string {
	data := fmt.Sprintf("%s|%s|%s|%d|%d|%s|%d|%d|%s|%s|%v",
		t.KeyWord,
		t.DeviceId,
		t.DeviceApn,
		t.ChannelId,
		t.LabelId,
		t.LabelValue,
		t.Page,
		t.Limit,
		t.TimeStart.Format(time.RFC3339),
		t.TimeEnd.Format(time.RFC3339),
		t.FieldOrders,
	)
	hash := md5.Sum([]byte(data))
	return fmt.Sprintf("%x", hash)
}

// 请求 解绑
type ReqUnbindRecLabelDevice struct {
	DeviceId   string    `json:"DeviceId"`          // 设备编码(国标Id)
	DeviceApn  string    `json:"DeviceApn"`         // 设备接入点(国标Id)
	ChannelId  int64     `json:"ChannelId"`         // 通道Id，设备为NVR时= -1
	LabelId    int64     `json:"LabelId"`           // 标签Id
	LabelValue string    `json:"LabelValue"`        // 标签值内容
	TimeStart  time.Time `json:"TimeStart"`         // 标签关系启用时间
	TimeEnd    time.Time `json:"TimeEnd,omitempty"` // 标签关系终止时间
}

// 响应 单一对象
type RespRecLabelDevice struct {
	DeviceId   string `json:"DeviceId"`   // 设备编码(国标Id)
	DeviceApn  string `json:"DeviceApn"`  // 设备接入点(国标Id)
	ChannelId  int64  `json:"ChannelId"`  // 通道Id，设备为NVR时= -1
	LabelId    int64  `json:"LabelId"`    // 标签Id
	LabelName  string `json:"LabelName"`  // 标签名称
	LabelValue string `json:"LabelValue"` // 标签值内容
	// Status     int8           `json:"Status"`            // 状态 正常:10 删除:-10
	TimeStart  time.Time      `json:"TimeStart"`         // 标签关系启用时间
	TimeEnd    time.Time      `json:"TimeEnd,omitempty"` // 标签关系终止时间
	TimeCreate time.Time      `json:"TimeCreate"`        // 记录创建时间
	TimeUpdate timex.TimeNull `json:"TimeUpdate"`        // 记录更新时间
}

// 响应 查询列表
type RespRecLabelDevices struct {
	Total           int64                `json:"Total"`           // 返回列表的总条数
	RecLabelDevices []RespRecLabelDevice `json:"RecLabelDevices"` // 返回列表对象
}
